package com.cicigodd.brick.plug.upload.operate;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.cicigodd.brick.plug.common.exception.ServiceException;
import com.cicigodd.brick.plug.common.utils.HttpServletUtil;
import com.cicigodd.brick.plug.upload.api.FileOperatorApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * 本地文件的操作
 *
 * @author cicigodd
 * @date 2022/09/23 08:42:00
 */
@Component
public class LocalFileOperator implements FileOperatorApi {

    @Value("${file.host}")
    private String host;
    @Value("${file.filepath}")
    private String path;

    /**
     * 判断文件是否存在
     * @param bucketName 桶名称
     * @param key        唯一标示id，例如a.txt, doc/a.txt
     * @return
     */
    @Override
    public boolean isExistingFile(String bucketName, String key) {
        String absoluteFile = path + File.separator + bucketName + File.separator + key;
        return FileUtil.exist(absoluteFile);
    }

    /**
     * 保存文件到磁盘
     * @param bucketName  桶名称
     * @param key         唯一标示id，例如a.txt, doc/a.txt
     * @param inputStream 文件流
     */
    @Override
    public void storageFile(String bucketName, String key, InputStream inputStream) {

        // 判断bucket存在不存在
        String bucketPath = path + File.separator + bucketName;
        if (!FileUtil.exist(bucketPath)) {
            FileUtil.mkdir(bucketPath);
        }

        // 存储文件
        String absoluteFile = path + File.separator + bucketName + File.separator + key;
        FileUtil.writeFromStream(inputStream, absoluteFile);
    }

    @Override
    public byte[] getFileBytes(String bucketName, String key) {

        // 判断文件存在不存在
        String absoluteFile = path + File.separator + bucketName + File.separator + key;
        if (!FileUtil.exist(absoluteFile)) {
            // 组装返回信息
            String errorMessage = StrUtil.format("bucket={},key={}", bucketName, key);
            throw new ServiceException("本地文件不存在，具体信息为：" + errorMessage);
        } else {
            return FileUtil.readBytes(absoluteFile);
        }
    }

    @Override
    public BufferedInputStream getBufferedInputStream(String bucketName, String key) {

        // 判断文件存在不存在
        String absoluteFile = path + File.separator + bucketName + File.separator + key;
        if (!FileUtil.exist(absoluteFile)) {
            // 组装返回信息
            String errorMessage = StrUtil.format("bucket={},key={}", bucketName, key);
            throw new ServiceException("本地文件不存在，具体信息为：" + errorMessage);
        } else {
            return FileUtil.getInputStream(absoluteFile);
        }
    }

    @Override
    public String getFileUrl(String bucketName, String key) {
        // 获取context-path
        String contextPath = HttpServletUtil.getRequest().getContextPath();
        return contextPath + "/sysFile/previewByObjectName" + "?fileBucket=" + bucketName + "&fileObjectName=" + key;
    }


    @Override
    public void deleteFile(String bucketName, String key) {

        // 判断文件存在不存在
        String file = path + File.separator + bucketName + File.separator + key;
        if (!FileUtil.exist(file)) {
            return;
        }

        // 删除文件
        FileUtil.del(file);

    }
    @Override
    public void deleteFile(String url) {
        String bucketName = getParamByUrl(url, "bucketName");
        String fileObjectName = getParamByUrl(url, "fileObjectName");
        // 判断文件存在不存在
        String file = path + File.separator + bucketName + File.separator + fileObjectName;
        if (!FileUtil.exist(file)) {
            return;
        }

        // 删除文件
        FileUtil.del(file);

    }

    /**
     * 获取链接参数
     * @param url
     * @param name
     * @return
     */
    public static String getParamByUrl(String url, String name) {
        url += "&";
        String pattern = "(\\?|&){1}#{0,1}" + name + "=[a-zA-Z0-9\\.]*(&{1})";
        Pattern r = Pattern.compile(pattern);
        Matcher matcher = r.matcher(url);
        if (matcher.find()) {
            return matcher.group(0).split("=")[1].replace("&", "");
        } else {
            return "";
        }
    }
}
